package com.ld.poetry.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime;

/**
 * 用户视图对象（User View Object）
 * 
 * 功能说明：
 * 1. 用于前端展示和交互的用户信息对象
 * 2. 包含用户的基本信息、认证信息和扩展信息
 * 3. 支持用户注册、登录、信息更新等操作
 * 
 * 使用场景：
 * 1. 用户注册和登录
 * 2. 用户信息展示
 * 3. 用户信息更新
 * 4. 用户权限管理
 * 
 * 注意事项：
 * 1. 密码字段在传输过程中需要加密
 * 2. 敏感信息（如密码）在返回前端时需要过滤
 * 3. 时间字段使用统一的格式
 * 4. 必填字段需要添加验证注解
 */
@Data
public class UserVO {

    /**
     * 用户ID
     * 
     * 功能说明：
     * 1. 用户的唯一标识符
     * 2. 主键，自增
     * 
     * 数据库字段：id
     * 字段类型：Integer
     * 是否必填：是
     * 是否唯一：是
     */
    private Integer id;

    /**
     * 用户名
     * 
     * 功能说明：
     * 1. 用户的登录名称
     * 2. 用于用户身份识别
     * 
     * 数据库字段：username
     * 字段类型：String
     * 是否必填：是
     * 是否唯一：是
     * 
     * 约束条件：
     * - 不能为空
     * - 建议长度限制
     * - 建议格式限制（如：只允许字母、数字、下划线）
     */
    @NotBlank(message = "用户名不能为空")
    private String username;

    /**
     * 手机号码
     * 
     * 功能说明：
     * 1. 用户的联系方式
     * 2. 可用于找回密码
     * 
     * 数据库字段：phone_number
     * 字段类型：String
     * 是否必填：否
     * 是否唯一：是
     * 
     * 约束条件：
     * - 建议验证手机号格式
     * - 建议加密存储
     */
    private String phoneNumber;

    /**
     * 电子邮箱
     * 
     * 功能说明：
     * 1. 用户的电子邮箱地址
     * 2. 可用于找回密码和接收通知
     * 
     * 数据库字段：email
     * 字段类型：String
     * 是否必填：否
     * 是否唯一：是
     * 
     * 约束条件：
     * - 建议验证邮箱格式
     * - 建议加密存储
     */
    private String email;

    /**
     * 密码
     * 
     * 功能说明：
     * 1. 用户的登录密码
     * 2. 用于身份验证
     * 
     * 数据库字段：password
     * 字段类型：String
     * 是否必填：是
     * 
     * 约束条件：
     * - 不能为空
     * - 必须加密存储
     * - 建议设置密码强度要求
     * - 建议定期更换密码
     */
    @NotBlank(message = "密码不能为空")
    private String password;

    /**
     * 性别
     * 
     * 功能说明：
     * 1. 用户的性别信息
     * 2. 用于个性化展示
     * 
     * 数据库字段：gender
     * 字段类型：Integer
     * 是否必填：否
     * 
     * 取值说明：
     * - 0: 未知
     * - 1: 男
     * - 2: 女
     */
    private Integer gender;

    /**
     * 头像
     * 
     * 功能说明：
     * 1. 用户的头像图片地址
     * 2. 用于用户信息展示
     * 
     * 数据库字段：avatar
     * 字段类型：String
     * 是否必填：否
     * 
     * 约束条件：
     * - 建议使用相对路径
     * - 建议设置默认头像
     */
    private String avatar;

    /**
     * 个人简介
     * 
     * 功能说明：
     * 1. 用户的个人介绍
     * 2. 用于展示用户信息
     * 
     * 数据库字段：introduction
     * 字段类型：String
     * 是否必填：否
     * 
     * 约束条件：
     * - 建议限制长度
     * - 建议过滤敏感内容
     */
    private String introduction;

    /**
     * 订阅信息
     * 
     * 功能说明：
     * 1. 用户的订阅内容
     * 2. 用于个性化推送
     * 
     * 数据库字段：subscribe
     * 字段类型：String
     * 是否必填：否
     * 
     * 约束条件：
     * - 建议使用JSON格式存储
     * - 建议限制订阅数量
     */
    private String subscribe;

    /**
     * 创建时间
     * 
     * 功能说明：
     * 1. 用户账号的创建时间
     * 2. 用于记录和统计
     * 
     * 数据库字段：create_time
     * 字段类型：LocalDateTime
     * 是否必填：是
     * 
     * 格式说明：
     * - 前端展示格式：yyyy-MM-dd HH:mm:ss
     * - 时区：GMT+8
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    /**
     * 更新时间
     * 
     * 功能说明：
     * 1. 用户信息的最后更新时间
     * 2. 用于记录修改历史
     * 
     * 数据库字段：update_time
     * 字段类型：LocalDateTime
     * 是否必填：是
     * 
     * 格式说明：
     * - 前端展示格式：yyyy-MM-dd HH:mm:ss
     * - 时区：GMT+8
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;

    /**
     * 更新人
     * 
     * 功能说明：
     * 1. 记录最后更新用户信息的人
     * 2. 用于追踪修改记录
     * 
     * 数据库字段：update_by
     * 字段类型：String
     * 是否必填：否
     */
    private String updateBy;

    /**
     * 是否为站长
     * 
     * 功能说明：
     * 1. 标识用户是否为系统管理员
     * 2. 用于权限控制
     * 
     * 数据库字段：is_boss
     * 字段类型：Boolean
     * 是否必填：是
     * 默认值：false
     */
    private Boolean isBoss = false;

    /**
     * 访问令牌
     * 
     * 功能说明：
     * 1. 用户的身份认证令牌
     * 2. 用于接口访问授权
     * 
     * 数据库字段：无（临时字段）
     * 字段类型：String
     * 是否必填：否
     * 
     * 注意事项：
     * - 该字段不持久化到数据库
     * - 建议设置过期时间
     * - 建议加密传输
     */
    private String accessToken;

    /**
     * 验证码
     * 
     * 功能说明：
     * 1. 用于验证用户身份
     * 2. 可用于注册、登录、找回密码等场景
     * 
     * 数据库字段：无（临时字段）
     * 字段类型：String
     * 是否必填：否
     * 
     * 注意事项：
     * - 该字段不持久化到数据库
     * - 建议设置有效期
     * - 建议限制验证次数
     */
    private String code;
}
